// 定义日期格式化选项的接口
interface DateFormatOptions {
	"M+" : number; // 月份
	"d+" : number; // 日
	"h+" : number; // 小时
	"m+" : number; // 分钟
	"s+" : number; // 秒
	"q+" : number; // 季度
	"S" : number;  // 毫秒
}

/**
 * 格式化日期
 * @param date 要格式化的日期对象或日期字符串
 * @param fmt 格式字符串，例如 "yyyy-MM-dd hh:mm:ss"
 * @returns 格式化后的日期字符串
 */
export function formatDate(date : Date | string | number, fmt : string) : string {
	if(!date) return ''
	try {
		date = new Date(date);
		// 如果日期无效，返回 'Invalid Date'
		if (isNaN(date.getTime())) return 'Invalid Date';
	} catch (e) {
		// 捕获错误，默认为当前日期
		date = new Date();
	}

	// 创建格式化选项映射
	const o : DateFormatOptions = {
		"M+": date.getMonth() + 1,                    // 月份
		"d+": date.getDate(),                         // 日
		"h+": date.getHours(),                        // 小时
		"m+": date.getMinutes(),                      // 分钟
		"s+": date.getSeconds(),                      // 秒
		"q+": Math.floor((date.getMonth() + 3) / 3),  // 季度
		"S": date.getMilliseconds()                   // 毫秒
	};

	// 处理年份 (y+)
	if (/(y+)/.test(fmt)) {
		// 将匹配到的年份部分替换为实际年份
		fmt = fmt.replace(RegExp.$1, date.getFullYear().toString().slice(4 - RegExp.$1.length));
	}

	// 处理其他日期格式部分
	for (const k in o) {
		if (new RegExp(`(${k})`).test(fmt)) {
			// 获取当前匹配的格式符，替换为对应值
			const value = o[k as keyof DateFormatOptions].toString();
			fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? value : value.padStart(2, '0'));
		}
	}

	return fmt;
}